package Servicios;

import DAO.DAOAsignatura;
import DAO.DAOAsignaturaOfertaAcademica;
import DAO.DAOOfertaAcademica;
import DAO.DAOProfesor;
import Dominio.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GestorDeOfertaAcademica extends HttpServlet{

    private final String ID_REGISTRO_ASIGNATURA_OFERTA = "registrarAsignaturaOferta";
    private final String ID_BUSQUEDA_ASIGNATURAS_MODF = "buscarAsignaturasOfertaModf";
    private final String ID_BUSQUEDA_DATOS_ASIGNATURAS_MODF = "buscarDatosAsignaturaModf";
    private final String ID_MODIFICACION_ASIGNATURA = "modificarAsignaturaOferta";
    private final String ID_ELIMINACION_ASIGNATURA = "eliminarAsignatura";
    private final String ID_BUSQUEDA_ASIGNATURAS_ELIM = "buscarAsignaturasOfertaElim";
      
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        processRequest(request, response);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
        String id = request.getParameter("id");

        if (id.equals(ID_REGISTRO_ASIGNATURA_OFERTA)) {
            registrarAsignatura(request, response);
        } else if (id.equals(ID_BUSQUEDA_ASIGNATURAS_MODF)) {
            buscarAsignaturasModificables(request, response);
        } else if (id.equals(ID_BUSQUEDA_DATOS_ASIGNATURAS_MODF)) {
            buscarDatosDeAsignaturaModificables(request, response);
        } else if (id.equals(ID_MODIFICACION_ASIGNATURA)) {
            modificarAsignatura(request, response);
        } else if (id.equals(ID_BUSQUEDA_ASIGNATURAS_ELIM)) {
            buscarAsignaturasEliminables(request, response);
        } else if (id.equals(ID_ELIMINACION_ASIGNATURA)) {
            eliminarAsignatura(request, response);
        }
    }

    private void registrarAsignatura(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out=null;
        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            
            String claveOfertaAcademica = request.getParameter("idOfertaAcademica");
            int claveAsignatura = Integer.parseInt(request.getParameter("idAsignatura"));
            String programaEducativo = request.getParameter("programaEducativo");
            String semestre = request.getParameter("semestre");
            int claveMaestro = Integer.parseInt(request.getParameter("idProfesor"));
            int cantidadFragmentos = Integer.parseInt(request.getParameter("sizeHorario"));
            ArrayList<FragmentoHorario> horarios = new ArrayList<FragmentoHorario>();
            for(int index=1;index<=cantidadFragmentos;index++){
                FragmentoHorario horario = new FragmentoHorario();
                String cadenaIndex = Integer.toString(index);
                horario.setDiaSemana(request.getParameter("diaHorario"+cadenaIndex));
                horario.setHoraInicio(request.getParameter("horaInicioHorario"+cadenaIndex));
                horario.setHoraFin(request.getParameter("horaFinHorario"+cadenaIndex));
                horario.setAula(request.getParameter("aulaHorario"+cadenaIndex));
                horario.setClaveFragmentoHorario(-1);
                out.println(horario.getDiaSemana()+horario.getHoraInicio()+horario.getHoraFin()+horario.getAula());
                horarios.add(horario);
            }
            AsignaturaOfertaAcademica nueva = new AsignaturaOfertaAcademica();
            nueva.setClaveAsignatura(claveAsignatura);
            nueva.setClaveAsignaturaOferta(-1);
            DAOAsignatura daoA = new DAOAsignatura();
            Asignatura asignatura = daoA.buscarAsignatura(claveAsignatura);
            daoA.cerrarConexionAAsignatura();
            nueva.setNombre(asignatura.getNombre());
            nueva.setProgramaEducativo(programaEducativo);
            nueva.setSemestre(semestre);
            DAOProfesor daoP = new DAOProfesor();
            Profesor profesor = daoP.buscarProfesor(claveMaestro);
            nueva.setMaestro(profesor);
            nueva.setHorario(horarios);
            
            DAOOfertaAcademica daoO = new DAOOfertaAcademica();
            daoO.aniadirAsignaturaAOferta(claveOfertaAcademica, nueva);
            daoO.cerrarConexionAOferta();
            out.println("Asignatura Registrada con &eacute;xito");
        } catch (IOException ex) {
            out.println(ex.getMessage());
        } catch (NumberFormatException ex) {                           
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }

    private void buscarAsignaturasModificables(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out=null;
        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            String claveOfertaAcademica = request.getParameter("idOfertaAcademica");
            DAOOfertaAcademica daoO = new DAOOfertaAcademica();
            OfertaAcademica oferta = daoO.buscarOfertaAcademica(claveOfertaAcademica);
            ArrayList<AsignaturaOfertaAcademica> asignaturas = oferta.getAsignaturas();
            String cadena = "";
            cadena +="<td>Nombre de Asignatura:</td>"
                +"<td>"
                +"  <select name=\"selectorAsignatura\" id=\"asignatura\" onchange=\"buscarDatosAsignatura()\">"
                +"      <option value=\"\">Seleccionar Asignatura</option>";
            for(int index = 0; index<asignaturas.size(); index++){
                cadena+="      <option value="+asignaturas.get(index).getClaveAsignaturaOferta()+">"+asignaturas.get(index).getNombre()+"</option>";
            }
            cadena+="   </select>";
            cadena+="</td>";
            out.println(cadena);
        } catch (IOException ex) {
            out.println(ex.getMessage());
        } catch(NumberFormatException ex){                
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }
  
    private void buscarAsignaturasEliminables(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out=null;
        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            String claveOfertaAcademica = request.getParameter("idOfertaAcademica");
            DAOOfertaAcademica daoO = new DAOOfertaAcademica();
            OfertaAcademica oferta = daoO.buscarOfertaAcademica(claveOfertaAcademica);
            ArrayList<AsignaturaOfertaAcademica> asignaturas = oferta.getAsignaturas();
            String cadena = "";
            cadena+="<table>";
            cadena+="<tr>";
            cadena +="<td>Nombre de Asignatura:</td>"
                +"<td>"
                +"  <select name=\"selectorAsignatura\" id=\"asignatura\" >"
                +"      <option value=\"\">Seleccionar Asignatura</option>";
            for(int index = 0; index<asignaturas.size(); index++){
                cadena+="      <option value=\""+asignaturas.get(index).getClaveAsignaturaOferta()+"\">"+asignaturas.get(index).getNombre()+"</option>";
            }
            cadena+="   </select>";
            cadena+="</td>";
            cadena+="</tr>";
            cadena+="</table>";
            cadena+="<h3></h3>";
            cadena+="<input type=\"button\" id=\"eliminarAsignaturaOferta\" value=\"Eliminar Asignatura de Oferta Academica\"/>";
            out.println(cadena);
        } catch (IOException ex){
             out.println(ex.getMessage());
        } catch(NumberFormatException ex) {
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }
 
    private void buscarDatosDeAsignaturaModificables(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out=null;
        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            int claveAsignaturaOfertaAcademica = Integer.parseInt(request.getParameter("idAsignatura"));
            DAOAsignaturaOfertaAcademica daoA = new DAOAsignaturaOfertaAcademica();
            AsignaturaOfertaAcademica asignatura = daoA.buscarAsignaturaOfertaAcademica(claveAsignaturaOfertaAcademica);
            String cadena = "";
            cadena+="<table>"
                    +"    <tr>"
                    +"        <td>Programa Educativo:</td>"
                    +"        <td><input type=\"text\" id=\"programaEducativo\" value=\""+asignatura.getProgramaEducativo()+"\"></td>"
                    +"    </tr>"
                    +"    <tr>"
                    +"        <td>Semestre:</td>"
                    +"        <td><input type=\"text\" id=\"semestre\" value=\""+asignatura.getSemestre()+"\"></td>"
                    +"    </tr>"
                    +"</table>"
                    +"<h3>Datos Profesor</h3>"
                    +"<table>"
                    +"    <tr>"
                    +"        <td>Nombre del Profesor:</td>"
                    +"        <td>"
                    +"            <select name=\"selectorProfesor\" id=\"profesor\">"
                    +"                <option value=\"\">Seleccionar Profesor</option>";
            DAOProfesor daoP = new DAOProfesor();
            ArrayList<Profesor> profesores = daoP.buscarTodosLosProfesores();
            for(int i = 0; i < profesores.size(); i++){
                String clave = Integer.toString(profesores.get(i).getClaveProfesor());
                String nombre = profesores.get(i).getNombre()+" "+profesores.get(i).getApellido();
                String seleccionada = "";
                if(asignatura.getMaestro().getClaveProfesor()==profesores.get(i).getClaveProfesor()){
                    seleccionada="selected";
                }
                cadena+="                <option value=\""+clave+"\" "+seleccionada+">"+nombre+"</option>";
            }
            cadena+="            </select>"
                    +"        </td>"
                    +"</table>"
                    +"<h3>Horario</h3>"
                    +"<table id=\"tablaHorario\">";
            ArrayList<FragmentoHorario> horarios = asignatura.getHorario();
            for(int j=0; j<horarios.size(); j++){
                cadena+="<tr>"
                    +"<td>Dia:</td>"
                    +"<td><input id=\"diaHorario"+(j+1)+"\" type=\"text\" value=\""+horarios.get(j).getDiaSemana()+"\"></td>"
                    +"</tr>"
                    +"<tr>"
                    +"<td>Hora Inicio:</td>"
                    +"<td><input id=\"horaInicioHorario"+(j+1)+"\" type=\"text\" value=\""+horarios.get(j).getHoraInicio()+"\"></td>"
                    +"</tr>"
                    +"<tr>"
                    +"<td>Hora Fin:</td>"
                    +"<td><input id=\"horaFinHorario"+(j+1)+"\" type=\"text\" value=\""+horarios.get(j).getHoraFin()+"\"></td>"
                    +"</tr>"
                    +"<tr>"
                    +"<td>Aula:</td>"
                    +"<td><input id=\"aulaHorario"+(j+1)+"\" type=\"text\" value=\""+horarios.get(j).getAula()+"\"></td>"
                    +"</tr>"
                    +"<tr>"
                    +"<td> </td>"
                    +"<td><h3 id=\"espacio"+(j+1)+"\"></h3>"
                    +"</tr>";
            }
            cadena+="</table>"
                    +"<input type=\"button\" value=\"Nuevo Horario\" onclick=\"agregarEntradaHorario()\"/>"
                    +"<input type=\"button\" value=\"Borrar Horarios\" onclick=\"borrarHorario()\"/>"
                    +"<h3></h3>"
                    +"<input type=\"button\" id=\"modificarAsignaturaOferta\" value=\"Modificar Asignatura\"/>";
            cadena+="|~cantidadHorario="+Integer.toString(horarios.size());
            cadena+="|~claveAsignaturaOferta="+Integer.toString(asignatura.getClaveAsignaturaOferta());
            
            out.print(cadena);
        } catch (IOException ex){
            out.println(ex.getMessage());
        } catch(NumberFormatException ex){               
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }

    private void modificarAsignatura(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out=null;
        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            
            String claveOfertaAcademica = request.getParameter("idOfertaAcademica");
            int claveAsignaturaOfertaAcademica = Integer.parseInt(request.getParameter("idAsignaturaOfertaAcademica"));
            int claveAsignatura = Integer.parseInt(request.getParameter("idAsignatura"));
            String programaEducativo = request.getParameter("programaEducativo");
            String semestre = request.getParameter("semestre");
            int claveMaestro = Integer.parseInt(request.getParameter("idProfesor"));
            int cantidadFragmentos = Integer.parseInt(request.getParameter("sizeHorario"));
            ArrayList<FragmentoHorario> horarios = new ArrayList<FragmentoHorario>();
            for(int index=1;index<=cantidadFragmentos;index++){
                FragmentoHorario horario = new FragmentoHorario();
                String cadenaIndex = Integer.toString(index);
                horario.setDiaSemana(request.getParameter("diaHorario"+cadenaIndex));
                horario.setHoraInicio(request.getParameter("horaInicioHorario"+cadenaIndex));
                horario.setHoraFin(request.getParameter("horaFinHorario"+cadenaIndex));
                horario.setAula(request.getParameter("aulaHorario"+cadenaIndex));
                horario.setClaveFragmentoHorario(-1);
                horarios.add(horario);
            }
            AsignaturaOfertaAcademica nueva = new AsignaturaOfertaAcademica();
            nueva.setClaveAsignatura(claveAsignatura);
            nueva.setClaveAsignaturaOferta(claveAsignaturaOfertaAcademica);
            DAOAsignatura daoA = new DAOAsignatura();
            Asignatura asignatura = daoA.buscarAsignatura(claveAsignatura);
            daoA.cerrarConexionAAsignatura();
            nueva.setNombre(asignatura.getNombre());
            nueva.setProgramaEducativo(programaEducativo);
            nueva.setSemestre(semestre);
            DAOProfesor daoP = new DAOProfesor();
            Profesor profesor = daoP.buscarProfesor(claveMaestro);
            nueva.setMaestro(profesor);
            nueva.setHorario(horarios);
            
            
            DAOAsignaturaOfertaAcademica daoAO = new DAOAsignaturaOfertaAcademica();
            daoAO.actualizarAsignatura(claveAsignaturaOfertaAcademica, nueva);
            daoAO.cerrarConexionAAsignaturaOferta();
            out.println("Asignatura Actualizada con &eacute;xito");
        } catch (IOException ex){
            out.println(ex.getMessage());
        }catch(NumberFormatException ex){               
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }

    private void eliminarAsignatura(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out=null;
        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            
            String claveOfertaAcademica = request.getParameter("idOfertaAcademica");
            String prueba =request.getParameter("idAsignaturaOfertaAcademica");
            int claveAsignaturaOfertaAcademica = Integer.parseInt(request.getParameter("idAsignatura"));
            
            DAOOfertaAcademica daoO = new DAOOfertaAcademica();
            daoO.eliminarAsignaturaAOferta(claveOfertaAcademica, claveAsignaturaOfertaAcademica);
            daoO.cerrarConexionAOferta();
            out.println("Asignatura Eliminada con &eacute;xito");
        } catch (IOException ex){
            out.println(ex.getMessage());
        } catch(NumberFormatException ex){               
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }
}
